package src.H_JDBC;

import java.sql.*;

// JDBC全称：java database connectivity，简称jdbc， 翻译就是 Java 数据库连接
// idea点击右侧database，第四个小扳手图标也能连接数据库，无代码连接
public class H_01_JDBC {
    public static void main(String[] args) throws Exception {
        // 前提：先导入jar包，mysql-connector-j-8.0.32.jar
        // 1、注册驱动，将Driver类加载到内存中，并将mysql驱动注册到DriverManager中去，这一步是为了第二步获取连接用的
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 2、获取连接
        String url = "jdbc:mysql://localhost:3306/mysqbase"; // jdbc.mysql://ip地址:端口号/数据库名称
        String user = "root"; // 数据库账户
        String password = "123456"; // 数据库密码
        Connection connection = DriverManager.getConnection(url,user,password); // 底层会遍历所有已经注册过的驱动，并找到mysql的驱动建立连接
        // 3、定义sql语句
        String sql1 = "insert into tang(name,sex,age) values (?,?,?)";
        String sql2 = "select * from tang";
        // 4、PreparedStatement相比statement效率更高，编译一次运行多次，并解决了sql注入的问题
        PreparedStatement ps1 = connection.prepareStatement(sql1); //预编译SQL，先写sql，然后不执行
        ps1.setString(1,"小猪猪"); // 赋值
        ps1.setString(2,"男");
        ps1.setInt(3,22);
        PreparedStatement ps2 = connection.prepareStatement(sql2);
        // 5、执行sql语句
        int i = ps1.executeUpdate(); // executeUpdate 用于增删改，返回受影响的行数，注意一般情况下会大于0，但创建一个新的表这样的sql代码受影响行数是0
        ResultSet resultSet = ps2.executeQuery(); // executeQuery 用于查，返回一个结果集

        // 如果要开启事务则这样写
        /*try {
            // 开启事务
            connection.setAutoCommit(false);
            int i = statement.executeUpdate(sql1);
            ResultSet rs = statement.executeQuery(sql2);
            // 提交事务
            connection.commit();
        } catch (Exception e) {
            //回滚事务
            connection.rollback();
            e.printStackTrace();
        }*/

        // 6、处理结果
        System.out.println("受影响的行数为:"+i);
        while (resultSet.next()){ // 遍历结果集
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            char sex = resultSet.getString("sex").charAt(0); // charAt(0)，获取字符串下标为0的内容
            int age = resultSet.getInt("age");
            System.out.println("id: "+id+" ,name: "+name+" ,sex: "+sex+" ,age: "+age);
        }
        // 7、释放资源
        resultSet.close();
        ps1.close();
        ps2.close();
        connection.close();
    }
}
